package io.github.lucaseasedup.logit.logging; import io.github.lucaseasedup.logit.LogItCoreObject; import io.github.lucaseasedup.logit.util.PlayerUtils; import java.util.regex.Matcher; import org.apache.logging.log4j.Level; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Marker; import org.apache.logging.log4j.core.Filter; import org.apache.logging.log4j.core.LogEvent; import org.apache.logging.log4j.core.Logger; import org.apache.logging.log4j.message.Message; import org.bukkit.entity.Player; public final class Log4jFilter extends LogItCoreObject { public Log4jFilter(CommandSilencer commandSilencer) { if (commandSilencer == null) throw new IllegalArgumentException(); this.commandSilencer = commandSilencer; } public void register() { Logger rootLogger = (Logger) LogManager.getRootLogger(); rootLogger.addFilter(new Filter() { @Override public Result filter(LogEvent event) { if (!commandSilencer.isFiltersRegistered()) return Result.NEUTRAL; if (event.getMessage().getFormattedMessage() == null) return Result.NEUTRAL; if (!event.getLoggerName().endsWith(".PlayerConnection")) return Result.NEUTRAL; Matcher matcher = commandSilencer.getMatcherForMsg( event.getMessage().getFormattedMessage() ); if (matcher.find()) { String username = matcher.group(1); String label = matcher.group(2); Player player = PlayerUtils.getPlayer(username); // If the player isn't logged in and has to log in, do not // show any commands issued -- they might have mistakenly // typed e.g. "/logni 1234" instead of "/login 1234". if (!getSessionManager().isSessionAlive(player) && getCore().isPlayerForcedToLogIn(player)) { return Result.DENY; } if (commandSilencer.isCommandSilenced(label)) { return Result.DENY; } } return Result.NEUTRAL; } @Override public Result filter( Logger logger, Level level, Marker marker, Message msg, Throwable t ) { return Result.NEUTRAL; } @Override public Result filter( Logger logger, Level level, Marker marker, Object msg, Throwable t ) { return Result.NEUTRAL; } @Override public Result filter( Logger logger, Level level, Marker marker, String msg, Object... params ) { return Result.NEUTRAL; } @Override public Result getOnMismatch() { return Result.NEUTRAL; } @Override public Result getOnMatch() { return Result.NEUTRAL; } }); } private final CommandSilencer commandSilencer; }